/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.fp.miscs;

import java.io.IOException;
import java.util.Date;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import java.util.logging.MemoryHandler;

/**
 *
 * @author iroiro
 */
public class LoggerUtilities {

    public static final int FILE_SIZE = 1024 * 1024;

    public static void main(String[] a) throws IOException {
        //cria um novo objeto logger usado para mandar as mensagens de erro.
        Logger jornal = Logger.getLogger(LoggerUtilities.class.getName());
        //desta forma ele cria se nao existir o arquivo de log com um tamanho
        //fixo (file size = 1mg), com apenas 1 arquivo de log sendo o que 
        //foi definido para anexar os novos registros. o filehander por default
        //usa um XMLFormater, i.e. fh.setFormatter(new XMLFormatter());
        FileHandler fh = new FileHandler("fp.xml", FILE_SIZE, 1, false);
        //caso nao queira saida em formato xml deve-se setar um simpleformater
        // i.e. fh.setFormatter(new SimpleFormatter());
        //fh.setFormatter(new SimpleFormatter());
        //-------------------------------------------------------------------
        //por default o logging.properties sempre seta saida para a console.
        //para suprimir a saida deve-se setar o arquivo de props ou remover os
        //handlers defaults com
        //Handler[] hd = jornal.getHandlers();
        //jornal.removeHandler(hd[0]);
        //outra versao encontrada na web no entanto ambas estao retornando
        //
        //Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
        //at org.fp.miscs.LoggerUtilities.main(LoggerUtilities.java:40)
        //Java Result: 1        
//        Handler[] handlers = jornal.getHandlers();
//        if (handlers[0] instanceof ConsoleHandler){
//            jornal.removeHandler(handlers[0]);
//        }        
        jornal.addHandler(fh);
        //criar um novo filehandler e testar um formater configurado
        //configurado para 3 arquivos de log com o nome em rolling pattern
        FileHandler fh2 = new FileHandler("fp2%g.log", FILE_SIZE, 3, true);
        fh2.setFormatter(new Formatter() {

            public String format(LogRecord record) {
                StringBuffer buf = new StringBuffer(1000);
                buf.append(new Date());
                buf.append(' ');
                buf.append(record.getLevel());
                buf.append(' ');
                buf.append(record.getLoggerName());
                buf.append(' ');
                buf.append(formatMessage(record));
                buf.append('\n');
                return buf.toString();
            }
        });

        jornal.addHandler(fh2);

        ConsoleHandler ch = new ConsoleHandler();
        jornal.addHandler(ch);
        //MemoryHandler novo = new MemoryHandler(ch, FILE_SIZE, Level.SEVERE);

        jornal.setLevel(Level.OFF);

        for (int i = 0; i < 1000; i++) {
            jornal.info("INFO MENSAGEM");
            jornal.warning("WARNING MENSAGEM");
            jornal.severe("SEVERE MENSAGEM");
            jornal.fine("FINE MENSAGEM");
            jornal.finer("FINER MENSAGEM");
            jornal.finest("FINEST MENSAGEM");
        }
    }

    public void initMemLog(int numRec) throws IOException {
        //tipico file handler. 1mb com anexacao
        FileHandler fh = new FileHandler("log.new.log", FILE_SIZE, 1, true);
        //cria inteiro para controlar o numero de registros
        int numRecords = numRec;
        //cria um handler do tipo memoria. o trigger Level.Push faz com que
        //o que for registrado seja despejado da memoria para arquivo quando
        //for registrado algum log do level setado.
        MemoryHandler mh = new MemoryHandler(fh, numRecords, Level.SEVERE);
        //o resto eh o default. um objeto para o loger e adiciona o memory
        //handler ao logger.
        Logger miniJornal = Logger.getLogger(this.getClass().getName());
        miniJornal.addHandler(mh);

    }

    public void initMemLog(int numRec, boolean condicao) throws SecurityException, IOException {
        //tipico file handler. 1mb com anexacao
        FileHandler fh = new FileHandler("log.new.log", FILE_SIZE, 1, true);
        //cria inteiro para controlar o numero de registros
        int numRecords = numRec;
        //cria um handler do tipo memoria. o trigger Level.Push faz com que
        //o que for registrado seja despejado da memoria para arquivo quando
        //for registrado algum log do level setado.
        MemoryHandler mh = new MemoryHandler(fh, numRecords, Level.SEVERE);
        //o resto eh o default. um objeto para o loger e adiciona o memory
        //handler ao logger.
        Logger miniJornal = Logger.getLogger(this.getClass().getName());
        miniJornal.addHandler(mh);

    }
}
